// unknown 和 any 都是顶级的类型

/* 
// unknown是any的安全型，默认情况下 unknown 必须要进行类型检测才能使用(类型检查、类型断言)
let val: any = true; // =====> 可以赋值任意值
val(); // =====> 没有类型监测，可以直接调用 
*/
let val: unknown = true;
// val(); // =====> 有类型监测，不可以直接调用
// 默认情况下 unknown 必须要现进行类型检测才能使用(类型检查、类型断言)
function processInput(val: unknown) {
  // 类型检查
  if (typeof val === "string") {
    val.toUpperCase();
    // 类型检查
  } else if (typeof val === "number") {
    val.toFixed();
  }
}
let name: unknown = "JIANGWEN";
// 类型断言
(name as string).toUpperCase();

//unknown 在联合类型中和交叉类型中的特点
type Unionunknown1 = unknown | string | null | undefined; // unknown 和任何类型 做联合类型都是unknown
type Unionunknown2 = any | string | null | undefined; // any 和任何类型 any
type Internunknown1 = unknown & string; // unknown获取的类型是string，如果是any 则返回的是any
type Internunknown2 = any & string; // unknown获取的类型是string，如果是any 则返回的是any
//区分类型是unknwon 还是any可以采用交叉类型,不能用keyof 来取unkown的类型
type IKey0f1 = keyof unknown; // ===> IKey0f1 = never //
type IKey0f2 = keyof any; // ===> IKey0f2 = string | number | symbol
type IKey0f3 = keyof never; // ===> IKey0f2 = string | number | symbol
export {};
